perm filename YEAR.SAI[1,BGB] blob sn#053577 filedate 1973-07-14 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00009 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	BEGIN	"YEAR"
C00005 00003	α SUBROUTINES OTIME, TOTAL, PRNTOT
C00007 00004	α HEAP SORT
C00011 00005	α FILE OPENING CEREMONIES
C00015 00006	α SCAN'A'LINE OF INPUT LOOP
C00018 00007	α ACCUMULATE GRAND TOTALS
C00021 00008	α PRINT THE CLASS CPU TIME TOTALS
C00023 00009	α SORT ON EACH DATA FIELD
C00026 ENDMK
C⊗;
BEGIN	"YEAR"
	REQUIRE "ABBREV[SYS,BGB]" SOURCE_FILE;
	REQUIRE 2000 NEW_ITEMS;
	REQUIRE 2000 PNAMES;
	DEFINE SUBR="SIMPLE PROCEDURE";

α IO VARIABLES;
	INTEGER CNT,BRK,EOF,CHR,FLG,I,J;
	STRING LINE;
	INTEGER ITEMVAR IPROG;
	INTEGER BUG;

α DECLARE ALL THEM PROGRAMMERS;
	INTEGER	ITEM  PM,REB,GAR,GUE,WAP,RCB,CCC,DCL,JJM,JRA,
	 JWG,MBS, CT,RS1,SLM,BMJ,SUZ,PAM,PMK,ROG,CKR,NMG,NJM,THO,
	 MIB,EMC,JMG,MUZ,MUS,TVR,JBR,KVL,ALS,
	 SYS,REG,JRL,JAM,PJS,SRS,
	 JHS,DCS,RHT,TES,EHS,JOE,
	 GJG,AIL,AKC, WD,CCG,IGR,
	 RLL, ZM,JMC,RGM,SAN,MAL,
	 BWP,JEV,RWW,PDQ, BO,RBT,
	 MJH,PLF, SL,JGC,BLF, AH,
	 MHR,CJR,YAW,GJA,TOB,SHY,
	 YYY, GG,RKN,RPO,LOU,KKP,
	 VDS,JAF,BGB,AKI,AJT,DFD,
	 RPH,H,FW,ELM,PMP,DWP,MJW,TED,
	 GHB,DGB,KMC,KRD,HJE,ME,FDH,
	 TM1,HPM,VRP,EDS,DAV,JYS,JRB;

α DECLARE MAJOR GROUPS;
	SET MUSIC,MARS,ROBOTS,SYSTEMS,MTC,HMF,FOONLY,OTHERS,MT,SPEECH;
	DEFINE MUSIC#="1", MARS#="2", ROBOTS#="3", SYSTEMS#="4",
	MTC#="5", HMF#="6", FOONLY#="7", MT#="8", SPEECH#="9", OTHERS#="10";

α YEAR TIL DATE DATA FOR EACH PPPN;
	DEFINE SIZ = "2000";
	SAFE ITG ARRAY PRJ,LOG,TTY,CPU,KCS[1:SIZ],PRG[0:SIZ];
	SAFE ITG ARRAY TTY#,CPU#,KCS#[1:SIZ];
	INTEGER K,L,M;
	INTEGER PPNCNT;
	INTEGER ARRAY CLASS[1:500];  α LIKE SCHOOL...;
	SUBR OSTR (STRING S); ⊂ OUTSTR(S);OUT(2,S) ⊃;
α SUBROUTINES OTIME, TOTAL, PRNTOT;
α __________________________________________________________________;
SUBR OTIME (INTEGER MINUTES);
BEGIN "OTIME"
	INTEGER DAYS,HOURS,MINS;
	MINS	←	MINUTES MOD 60;
	HOURS	←	(MINUTES DIV 60) MOD 24;
	DAYS	←	MINUTES DIV (24*60);
	SETFORMAT(4,7);	OSTR(CVS(DAYS)&" DAYS ");
	SETFORMAT(2,7);	OSTR(CVS(HOURS)&":");
	SETFORMAT(-2,7);OSTR(CVS(MINS));
END "OTIME";
α __________________________________________________________________;
	INTEGER X1,X2,X3;
SUBR TOTAL (INTEGER I);
BEGIN
	TTY[I]←TTY[I]+X1;
	CPU[I]←CPU[I]+X2;
	KCS[I]←KCS[I]+X3;
END;
α __________________________________________________________________;
SUBR PRNTOT (INTEGER I; SET S; STRING STR);
BEGIN
	ITEMVAR IPROG;
	OSTR(↓&STR&" TOTALS."&↓);
	∀ IPROG|IPROGεS DO OSTR(CVIS(IPROG,FLG)&"," );OSTR(↓);
	OSTR("	CPU TIME	");
	OTIME(CPU[I]%60);
	OSTR(9&9&CVS(100*CPU[I]%CPU[SIZ])&" PERCENT OF TOTAL."&↓);
	OSTR("	"&CVS(KCS[I])&" KILO CORE SECONDS");
	OSTR(9&9&CVS(100*KCS[I]%KCS[SIZ])&" PERCENT OF TOTAL."&↓);
	OSTR("	CONSOLE TIME	");
	OTIME(TTY[I]);
	OSTR(9&9&CVS(100*TTY[I]%TTY[SIZ])&" PERCENT OF TOTAL."&↓);
	OSTR(↓);
END;
α __________________________________________________________________;
α HEAP SORT;
α ARRAY-A ARE THE KEYS, ARRAY-B ARE THE RECORDS;
α __________________________________________________________________;
SUBR HEAP1D (ITG ARRAY A,B; INTEGER N);
BEGIN "HEAPSORT"
	ITG I,J,K,X,Y;

α PUT'EM UNDER THE HEAP & ALLOW THE BIGGIES TO TRICKLE UP;

	FOR K←2 STEP 1 UNTIL N DO
	BEGIN
		I←K;
		X←A[I]; Y←B[I];
		WHILE I>1 ∧ X>A[J←I%2] DO
		BEGIN A[I]←A[J];B[I]←B[J];I←J END;
		A[I]←X;B[I]←Y;
	END;

α TAKE 'EM OFF THE TOP & PROMOTE SUBORDINATES;

	FOR K←N STEP -1 UNTIL 2 DO
	BEGIN
		X←A[K];Y←B[K];A[K]←A[1];B[K]←B[1];I←1;
		WHILE (J←2*I)<K DO
		BEGIN
			IF (J+1)<K ∧ A[J+1]>A[J] THEN J←J+1;
			IF X≥A[J] THEN DONE ELSE
			⊂ A[I]←A[J];B[I]←B[J];I←J ⊃;
		END;
		A[I]←X;B[I]←Y;
	END;
END "HEAPSORT";
α __________________________________________________________________;
α FILE OPENING CEREMONIES;
	OPEN(2,"DSK",0,0,3,0,0,0);ENTER(2,"O",0);
	OPEN(1,"DSK",0,3,0,CNT,BRK,EOF);
	⊂ STRING FILNAM; OUTSTR(" YTD OR MONTH NAME = ");
	  FILNAM ← INCHWL;
	  LOOKUP(1,FILNAM,FLG);
	  IF FLG THEN LOOKUP(1,FILNAM&"[ACT,SYS]",FLG);
	  IF FLG THEN ⊂ FILNAM←"YTD";
	  LOOKUP(1,"YTD[ACT,SYS]",FLG) ⊃;
	  OSTR(↓&↓&"YEAR TO DATE ANALYSIS OF FILE ");
	  OSTR(FILNAM&↓&↓);⊃;

α DECLARE SCAN BREAK CHARACTERS;
	BREAKSET(1,13,"I");
	BREAKSET(1,10,"O");
	FOR I←1 TIL 6 DO ⊂ CNT←120;LINE←INPUT(1,1) ⊃;
	BREAKSET(2, 9,"I");
	BREAKSET(2," ","O");
	BREAKSET(3,",]","I");
	BREAKSET(3,"[","O");

α PROJECT GROUPS;
	MUSIC ← {PM,REB,GAR,JWG,MBS,CT,RS1,SLM,BMJ,JAM,
		MIB,EMC,JMG,MUZ,MUS};
	SYSTEMS←{SYS,REG,JRL,PJS,SRS,DCS,FW,AIL,GUE,RHT,TES};
	MTC←{AKC,WD,CCG,IGR,RLL,ZM,JMC,RGM,SAN,MAL,
		BWP,JEV,RWW,DCL,JJM,JRA,SUZ};
	MARS←{PDQ,BO,RBT,MJH,PLF,SL};
	ROBOTS←{GJA,TOB,SHY,GG,YYY,RKN,RPO,LOU,KKP,TVR,WAP,RCB,CCC,
		JOE,VDS,JAF,BGB,AKI,AJT,DFD};
	FOONLY←{RPH,H,ELM,PMP,DWP,MJW,TED,EHS};
	HMF←{GHB,DGB,KMC,KRD,HJE,FDH,TM1,HPM,VRP,
		CKR,EDS,ROG,DAV,JYS,JRB};
	MT←{JGC,BLF,AH,MHR,CJR,YAW,PAM,PMK,ROG,CKR,NMG};
	SPEECH←{ALS,NJM,THO};
α ASSIGN PROJECT SERIAL NUMBERS;
	∀ IPROG | IPROGεMUSIC 	DO ∂(IPROG) ← SIZ - MUSIC#;
	∀ IPROG | IPROGεSPEECH	DO ∂(IPROG) ← SIZ - SPEECH#;
	∀ IPROG | IPROGεMARS  	DO ∂(IPROG) ← SIZ - MARS#;
	∀ IPROG | IPROGεSYSTEMS	DO ∂(IPROG) ← SIZ - SYSTEMS#;
	∀ IPROG | IPROGεROBOTS 	DO ∂(IPROG) ← SIZ - ROBOTS#;
	∀ IPROG | IPROGεMTC    	DO ∂(IPROG) ← SIZ - MTC#;
	∀ IPROG | IPROGεHMF    	DO ∂(IPROG) ← SIZ - HMF#;
	∀ IPROG | IPROGεFOONLY 	DO ∂(IPROG) ← SIZ - FOONLY#;
	∀ IPROG | IPROGεMT     	DO ∂(IPROG) ← SIZ - MT#;
α SCAN'A'LINE OF INPUT LOOP;
WHILE TRUE DO
BEGIN	"INPUT SCAN"
	STRING LINE,PPNSTR,PJSTR,PGSTR,LOGSTR,TTYSTR,CPUSTR,KCSSTR;
	INTEGER PROGMR,PROJCT;

α READ'A'LINE;
	CNT←120;LINE←INPUT(1,1);
	IF EOF THEN DONE;

α READ THE PPPN - [PRJ,PRG];
	PPNSTR ← SCAN(LINE,2,CHR);
	PJSTR  ← SCAN(PPNSTR,3,CHR);	PROJCT ← INTSCAN(PJSTR,CHR);
	PGSTR  ← SCAN(PPNSTR,3,CHR);	PROGMR ← CVSIX(PGSTR);

α DISTINGUISH A NEW MAN;
	IF PROGMR≠PRG[M] THEN ⊂ PRG[M←M+1]←PROGMR; L←0; ⊃;
	PRJ[M]←PRJ[M]+1;
	L←L+1; PPNCNT←PPNCNT+1;

α READ PPPN'S STATISTICS: LOGINS, CONSOLE h:m, CPU m:s, KCS;
	LOGSTR ← SCAN(LINE,2,CHR);
	TTYSTR ← SCAN(LINE,2,CHR);
	CPUSTR ← SCAN(LINE,2,CHR);
	KCSSTR ← SCAN(LINE,2,CHR);

α ACCUMULATE INDIVIDUAL TOTALS;
	LOG[M] ← LOG[M] + INTSCAN(LOGSTR,CHR);
	X1 ← INTSCAN(TTYSTR,CHR)*60 + INTSCAN(TTYSTR,CHR);
	X2 ← INTSCAN(CPUSTR,CHR)*60 + INTSCAN(CPUSTR,CHR);
	X3 ← INTSCAN(KCSSTR,CHR);
	TTY[M] ← TTY[M] + X1;
	CPU[M] ← CPU[M] + X2;
	KCS[M] ← KCS[M] + X3;

α ACCUMULATE CLASS TOTALS;
	IF PROJCT≥1 ∧ PROJCT≤500 THEN
	CLASS[PROJCT] ← CLASS[PROJCT] + X2;

α LOOKUP HIS GROUP NUMBER AND ACCUMULATE GROUP TOTALS;
	IPROG ← CVSI(PGSTR,FLG);
	IF FLG THEN TOTAL(SIZ-OTHERS#) ELSE TOTAL(∂(IPROG));
	IF FLG THEN PRG[M]←CVSIX(PGSTR&" ?");
END "INPUT SCAN";

	RELEASE(1);
	OUTSTR("EOF"&↓);
α ACCUMULATE GRAND TOTALS;
	J←0; FOR I←1 STEP 1 UNTIL M DO J←J+LOG[I]; LOG[SIZ]←J;
	J←0; FOR I←1 STEP 1 UNTIL M DO J←J+TTY[I]; TTY[SIZ]←J;
	J←0; FOR I←1 STEP 1 UNTIL M DO J←J+CPU[I]; CPU[SIZ]←J;
	J←0; FOR I←1 STEP 1 UNTIL M DO J←J+KCS[I]; KCS[SIZ]←J;

α PRINT GRAND TOTALS;
	OSTR("RAW GRAND TOTALS."&↓);
	SETFORMAT(10,7);
	OSTR("			"&CVS(M)&" PROGRAMMERS"&↓);
	OSTR("			"&CVS(PPNCNT)&" PPPN'S"&↓);
	OSTR("			"&CVS(LOG[SIZ])&" LOGIN'S"&↓);
	OSTR("	CONSOLE TIME 	"&CVS(TTY[SIZ])&" MINUTES"&↓);
	OSTR("	CPU TIME	"&CVS(CPU[SIZ])&" SECONDS"&↓);
	OSTR("			"&CVS(KCS[SIZ])&" KILO CORE SECONDS"&↓);
		OSTR(↓);
		OSTR("EQUIVALENT GRAND TOTALS."&↓);
	OSTR("	CONSOLE TIME	");
	OTIME(TTY[SIZ]); OSTR(↓);
	OSTR("	CPU TIME	");
	OTIME(CPU[SIZ]%60); OSTR(↓);

α PRINT THE GROUP TOTALS;
	PRNTOT(SIZ-SYSTEMS#,SYSTEMS,	"SYSTEMS AND NET");

	PRNTOT(SIZ-ROBOTS#,ROBOTS,	"ROBOTICS");
	PRNTOT(SIZ-MUSIC#,MUSIC,	"MUSIC");
	PRNTOT(SIZ-FOONLY#,FOONLY,	"FOONLY");
	PRNTOT(SIZ-HMF#,HMF,		"HIGHER MENTAL FUNCTIONS");
	PRNTOT(SIZ-MTC#,MTC,		"MATHEMATICAL THEORY OF COMPUTATION");
	PRNTOT(SIZ-MT#,MT,		"NATURAL LANGUAGE");
	PRNTOT(SIZ-SPEECH#,SPEECH,	"SPEECH");
	PRNTOT(SIZ-MARS#,MARS,		"MARS");
	PRNTOT(SIZ-OTHERS#,OTHERS,	"OTHERS");

α PRINT THE CLASS CPU TIME TOTALS;
	OSTR(↓&"TOTAL CPU TIME BY NUMERIC PROJECTS 20 TIL 500"&↓);
	OSTR("   which are alleged to be university course numbers."&↓);
	FOR I←20 TIL 500 DO
	IF CLASS[I]>60 THEN
BEGIN	"CLASS"
	INTEGER CPUTIM;
	OSTR(9&"COURSE #"&CVS(I)&9);
	CPUTIM←(CLASS[I])%60;
	SETFORMAT(3,7);
	OSTR(CVS(CPUTIM%60)&":");
	SETFORMAT(-2,7);
	OSTR(CVS(CPUTIM MOD 60));
	IF I=220 THEN OSTR(9&"MUSIC") ELSE
	IF I=206 THEN OSTR(9&"LISP") ELSE
	IF I=390 THEN OSTR(9&"ADV READING & RESEARCH") ELSE
	IF I=347 THEN OSTR(9&"HIGH SCHOOL HACKER - SMG") ELSE
	IF I=225 THEN OSTR(9&"ARTIFICIAL INTELLIGENCE") ELSE
	IF I=226 THEN OSTR(9&"REPRESENTATION IN A.I.") ELSE
	IF I=256 THEN OSTR(9&"MATHEMATICAL THEORY OF COMPUTATION") ELSE
	IF I=293 THEN OSTR(9&"COMPUTER LAB") ELSE
	IF I=137 THEN OSTR(9&"NUMERICAL ANALYSIS") ELSE
	IF I=140 THEN OSTR(9&"SYSTEMS PROGRAMMING") ELSE
	IF I=144 THEN OSTR(9&"DATA STRUCTURES");
	OSTR(↓);
END "CLASS";
α SORT ON EACH DATA FIELD;
	FOR I←1 TIL M DO TTY#[I]←CPU#[I]←KCS#[I]←I;
	HEAP1D(TTY,TTY#,M);
	HEAP1D(CPU,CPU#,M);
	HEAP1D(KCS,KCS#,M);
α TYPE OUT THE VILLAINS;
	OSTR(↓&↓);
	OSTR("THE RANK ORDER OF OUTSTANDING USERS"&↓);
	OSTR(↓&"RANK 	CPU-TIME HR:MIN	");
	OSTR(9&"KILO-CORE-SECONDS	CONSOLE-TIME"&↓);

α OUTPUT A LINE OF RANK ORDER;
	FOR I←M STEP -1 UNTIL M-200 DO
BEGIN "RANK'A'LINE"
	INTEGER CPUTIM;

α RANK ORDER;
	SETFORMAT(4,7);OSTR(CVS(M-I+1)&9);

α TOTAL CPU TIME;
	OSTR(CVXSTR(PRG[CPU#[I]])&"  ");CPUTIM←CPU[I]%60;SETFORMAT(3,7);
	OSTR(CVS(CPUTIM%60)&":");SETFORMAT(-2,7);
	OSTR(CVS(CPUTIM MOD 60)&9&9);

α KILO CORE SECONDS;
	SETFORMAT(2,7);
	OSTR(CVXSTR(PRG[KCS#[I]])&"  ");
	OSTR(CVS(KCS[I])&9&9);

α TOTAL CONSOLE TIME;
	OSTR(CVXSTR(PRG[TTY#[I]])&"  ");
	OTIME((TTY[I]));
	OSTR(↓);
END "RANK'A'LINE";
	RELEASE(2);
	OUTSTR(↓&9&"EOF"&↓);
END	"YEAR";